import org.apache.spark.sql.SparkSession

object zk2_2 {
  def main(args: Array[String]): Unit = {
    //    创建Spark SQL上下文对象，加载数据并注册用户表、电影表和观看记录表为DataFrame（5分）
    //    2. 显示加载的三个DataFrame的结构（Schema）并打印前10条样本数据。（5分）
    val spark = SparkSession.builder().appName("app").master("local[*]").getOrCreate()


    val frame = spark.read.csv("data/movies.txt")
    val frame2 = spark.read.csv("data/titanic_data.csv")
    val frame3 = spark.read.csv("data/watch_history.txt")

    frame.show(10)
    frame2.show(10)
    frame3.show(10)
    frame.createOrReplaceTempView("users")
    frame2.createOrReplaceTempView("movies")
    frame3.createOrReplaceTempView("watch_history")
//    3. 使用Spark SQL查询计算每部电影的平均评分（rating）。（5分）
spark.sql(
  """
    |select movie_id,avg(rating) from watch_history group by movie_id
    |""".stripMargin).show(false)

//    4. 统计每个用户观看的电影数量和总时长（5分）
//    user_id | 用户ID |
//      | movie_id | 电影ID |
//    | watch_time | 观看时间
//    （timestamp
//    ）|
//    | rating | 评分
//    （1 - 5 分
//    ）|
//    | watch_duration | 观看时长
//    （分钟
//    ）|
    spark.sql(
      """
        |select user_id,count(movie_id),sum(watch_duration) from watch_history group by watch_history group by user_id
        |""".stripMargin).show()
//    5. Spark SQL查询筛选出评分大于3的电影，并按照评分降序排列。（5分）
    spark.sql(
      """
        |select movie_id,rating from watch_history group by movie_id order by rating desc
        |""".stripMargin).show()
//    6. 创建一个自定义UDF函数，对用户的年龄进行分级，0-18岁为少年，19-35岁为青年，36-65为中年，65以上为老年（5分）


//    7. 结合第6问的自定义函数，统计不同年龄段的用户的观看电影的数量，时长，以及好评率（自主设计好评）（5分）
    spark.sql(
      """
        |select u.birth_year,count(movie_id),
        | w.watch_duration
        | from users u left join watch_history w on u.user_id=w.user_id
        | where w.rating=5
        |group by u.birth_year
        |""".stripMargin)

//    8. 统计出老年人最喜欢的电影（自主设计最喜欢）（5分）
    spark.sql(
      """
        |select birth_year,count(movie_id) from users where birth_year<="1985" group by movie_id order by count(movie_id) desc limit 1
        |""".stripMargin).show()
//    9. 计算不同类型电影差评率top3的电影（自主设计差评）（5分）
//    movie_id | 电影ID |
//      | movie_name | 电影名称 |
//    | genre | 电影类型 |
//    | release_year | 发行年份 |
    spark.sql(
      """
        |select m.genre,count(movie_id) from movies m left join watch_history w on m.movie_id=w.movie_id
        |where w.rating<=2 group by m.genre order by count(movie_id) desc limit 3
        |""".stripMargin).show()

//    10. 创建一个自定义UDF函数，将`watch_time`字段中的时间戳转换为星期几的字符串（例如：`周一`, `周二`等），并通过SQL查询显示每部电影在每周几被观看最多的次数。（5分）
//    users
//    ）
//    | 字段 | 含义 |
//    |--------------|----------|
//    | user_id | 用户ID |
//    | user_name | 用户姓名 |
//    | gender | 用户性别 |
//    | birth_year | 用户出生年 |
//    | register_date | 注册日期 |
//





  }
}
